spark
窄依赖
父RDD和子RDD的partition之间的关系是一对一的。或者父RDD和子
RDD的partition关系是多对一的。不会有shuffle的产生
宽依赖
父RDD与子RDD的partition之间的关系是一对多。会有shuffle的产生。

spark任务会根据RDD之间的依赖关系，形成一个DAG有向无环图，DAG会提交
给DAGScheduler,DAGScheduler会把DAG划分成相互依赖的多个stage,划分stge
的依据就是RDD之间的宽窄依赖。遇到宽依赖就划分stage,每个stage包含一个或
多个task任务。然后将这些task以taskSet的形式提交给TaskScheduler运行

Transformations算子
#### repartition

**增加或减少分区**。此算子会产生`shuffle`。

#### coalesce

`coalesce`常用来**减少分区**，算子中**第二个参数**是减少分区的过程中是否产生`shuffle`。

`true`为产生`shuffle`，`false`不产生`shuffle`。默认是`false`。

如果`coalesce`设置的分区数比原来的`RDD`的分区数还多的话，第二个参数设置为`false`不会起作用（转换之后分区数大于之前），如果设置成`true`，效果和`repartition`一样。

```scala
repartition(numPartitions) = coalesce(numPartitions,true)
```

#### groupByKey

作用在`K，V`格式的`RDD`上。根据`Key`进行分组。作用在`(K，V)`，返回`(K，Iterable <V>)`。

#### zip

将两个`RDD`中的元素（`KV格式/非KV格式`）变成一个`KV`格式的`RDD`,两个`RDD`的**个数必须相同**。

#### zipWithIndex

该函数将`RDD`中的元素和这个元素在`RDD`中的索引号（从0开始）组合成`（K,V）`对。


